//
// Description: 6029. 射箭比赛中的最大得分
// Created by Loading on 2022/3/20.
//

#include <bits/stdc++.h>

using namespace std;

vector<int> maximumBobPoints(int numArrows, vector<int> &aliceArrows) {
    int n = aliceArrows.size();
    vector<int> res;
    int _max = 0;
    /* 位运算，二进制枚举 */
    for (int i = 0; i < 1 << n; ++i) {
        int k = numArrows;
        vector<int> tmp;
        // 当前情况的分数和
        int cnt = 0;
        // 枚举每一个得分，1 为拿到该得分
        for (int j = 0; j < n; ++j) {
            if (i >> j & 1) {
                // 拿到该得分的情况下至少要比 Alice 射中的多一发
                int score = aliceArrows[j] + 1;
                tmp.emplace_back(score);
                k -= score;
                cnt += j;
            } else {
                tmp.emplace_back(0);
            }
        }
        // k < 0 时表示当前情况箭的总数不够
        if (k >= 0 && cnt > _max) {
            // 将剩余的箭补充至任意位置，这里取第0位
            tmp[0] += k;
            // 更新最大结果
            res = tmp;
            _max = cnt;
        }
    }

    return res;
}

int main() {
    int numArrows = 9;
    vector<int> aliceArrows{1, 1, 0, 1, 0, 0, 2, 1, 0, 1, 2, 0};
    vector<int> res = maximumBobPoints(numArrows, aliceArrows);
    for (auto x : res) {
        cout << x << ' ';
    }
    cout << endl;

    return 0;
}